#include <bits/stdc++.h>
#define int long long
using namespace std;
char buf[(1<<21)+5],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
int read() {
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)) {
		f|=(ch=='-');
		ch=getchar();
	}
	while(isdigit(ch)) {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f?-x:x;
}
int n,m,p;
int ans=0;
int a[1001][1001];
int f[1001][1001];
int z[1001][1001][98];
int sad[101][10001];
int c[98];
int ksm(int a,int b,int mod) {
	int sm=1;
	while(b) {
		if(b&1) sm=(sm*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return sm;
}
int inv(int x) {
	return ksm(x,p-2,p)%p;
}
signed main() {
	freopen("tsuki.in","r",stdin);
	freopen("tsuki.out","w",stdout);
	n=read(),m=read(),p=read();
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			a[i][j]=read();
			a[i][j]%=p;
		}
	}
	int q=read();
	if(n<=200&&m<=200&&q<=200) {
		for(int t=1; t<=q; t++) {
			int x_1=read(),y_1=read(),x_2=read(),y_2=read();
			int as=1;
			for(int i=x_1; i<=x_2; i++) {
				for(int j=y_1; j<=y_2; j++) {
					as*=a[i][j];
					as%=p;
				}
			}
			ans+=(t^(as%p));
			ans%=147744151;
		}
		cout<<ans;
		return 0;
	}
	if(p==998244353) {
		for(int i=0; i<=n+1; i++)
			for(int j=0; j<=m+1; j++)
				f[i][j]=1;
		for(int i=1; i<=n; i++) {
			int sans=1;
			for(int j=1; j<=m; j++) {
				sans*=a[i][j];
				sans%=p;
				f[i][j]=f[i-1][j];
				f[i][j]*=sans;
				f[i][j]%=p;
			}
		}
		for(int i=1; i<=q; i++) {
			int x_1=read(),y_1=read(),x_2=read(),y_2=read();
			int as=(f[x_1][y_2]%p*inv(f[x_2-1][y_2]%p*f[x_1][y_1-1]%p*inv(f[x_2-1][y_1-1])%p))%p;
			ans+=(i^(as%p));
			ans%=147744151;
		}
		cout<<ans;
		return 0;
	}
	if(p<=100) {
		for(int i=2; i<=100; i++) {
			sad[i][0]=1;
			for(int j=1; j<=10000; j++) {
				sad[i][j]=sad[i][j-1]*i;
				sad[i][j]%=p;
			}
		}
		for(int i=1; i<=n; i++) {
			memset(c,0,sizeof(c));
			for(int j=1; j<=m; j++) {
				int pp=a[i][j];
				for(int ii=2; ii<=sqrt(pp); ii++) {
					while(pp%ii==0) {
						pp/=ii;
						c[ii]++;
					}
				}
				if(pp>1)c[pp]++;
				for(int ii=2; ii<=97; ii++) {
					z[i][j][ii]+=z[i-1][j][ii];
					z[i][j][ii]+=c[ii];
				}
			}
		}
		for(int i=1; i<=q; i++) {
			memset(c,0,sizeof(c));
			int x_1=read(),y_1=read(),x_2=read(),y_2=read();
			for(int j=2; j<=97; j++)
				c[j]+=z[x_1][y_2][j];
			for(int j=2; j<=97; j++)
				c[j]+=z[x_2-1][y_1-1][j];
			for(int j=2; j<=97; j++)
				c[j]-=z[x_2-1][y_2][j];
			for(int j=2; j<=97; j++)
				c[j]-=z[x_1][y_1-1][j];
			int as=1;
			for(int ii=2; ii<=97; ii++) {
				as*=sad[ii][c[ii]];
				as%=p;
			}
			if(as!=1)ans+=((as%p)^i);
			ans%=147744151;
		}
		cout<<ans;
	}
	return 0;
}
